package com.example.wwj.service;

import com.example.wwj.mapper.UserMapper;
import com.example.wwj.pojo.User;
import com.example.wwj.vo.ResultVo;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public int save(User user) {
        if (user.getId() == null) {
            return userMapper.insert(user);
        } else {
            return userMapper.update(user);
        }
    }

    public List<User> findAll(){
        return userMapper.findAll();
    }

    public User findById(int id){
        return userMapper.findById(id);
    }

    public User findByUsername(String username){
        return userMapper.findByUsername(username);
    }

    public int deleteById(int id){
        return userMapper.delete(id);
    }

//    public ResultVo regist(User user) {
//        user.setStatus("用户");
//        //先根据手机号查询是否存在
//        User selectUser = userMapper.getUserByPhone(user.getUserphone());
//        if (selectUser != null) {
//            return ResultVo.errorVo(500, "手机号已存在");
//        } else {
//            //插入数据库
//            userMapper.insert(user);
//            return ResultVo.successVo();
//        }
//    }

    public ResultVo login(User user) {
        // 对用户输入的密码进行加密
        String encryptedPassword = encryptPassword(user.getPassword());

        // 根据用户名查询用户信息
        User selectUser = userMapper.findByUsername(user.getUsername());

        if (selectUser != null) {
            // 对比数据库中存储的加密密码和用户输入的加密密码是否一致
            if (selectUser.getPassword().equals(encryptedPassword)) {
                // 登录成功，生成并返回 token
                String token = generateToken(String.valueOf(selectUser.getId()), selectUser.getUsername());

                // 将 token 添加到返回结果中
                selectUser.setToken(token);

                // 返回用户信息
                return ResultVo.successVo(selectUser);
            } else {
                // 密码错误
                return ResultVo.errorVo(401, "密码输入错误");
            }
        } else {
            // 用户不存在
            return ResultVo.errorVo(404, "用户不存在");
        }
    }

    private String encryptPassword(String password) {
        // 在这里添加密码加密的逻辑，可以使用BCryptPasswordEncoder等进行密码加密
        return password; // 这里只是示例，实际上需要进行密码加密
    }

    private String generateToken(String userId, String username) {
        // 设置 token 过期时间，例如 1 小时
        long expirationTime = 3600000;

        SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS512);

        // 生成 token
        String token = Jwts.builder()
                .setSubject(username)
                .claim("userId", userId)
                .setExpiration(new Date(System.currentTimeMillis() + expirationTime))
                .signWith(key, SignatureAlgorithm.HS512) // 使用密钥进行签名
                .compact();

        return token;
    }
}
